package com.ingenio.dao;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.UnidadMedida;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class UnidadMedidaAdapter extends Adapter{
	
	public void agregarUnidadMedida(UnidadMedida um) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
	    	conn = (Connection) abrirConexion();
	    	String add ="INSERT into unidadmedida (descUnidadMedida, siglaUnidadMedida, IdUMConversion, coeficienteConv, umHabilitado) " +
					"VALUES (?, ?, ?, ?, 1)";
			stmt = (PreparedStatement) conn.prepareStatement(add);
			stmt.setString(1, um.getDescUnidadMedida());
			stmt.setString(2, um.getSiglaUnidadMedida());
			stmt.setInt(3, (um.getUmConversion()!=null)?um.getUmConversion().getIdUnidadMedida():0); // Asignar NULL de base de datos en lugar de 0
			stmt.setDouble(4, (um.getUmConversion()!=null)?um.getCoeficiente():0); //null 
	    	stmt.execute();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
	}
	
	public void eliminarUnidadMedida(UnidadMedida um) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String del ="UPDATE unidadmedida SET umHabilitado = 0 WHERE IdUnidadMedida = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(del);
	    	stmt.setInt(1, um.getIdUnidadMedida());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    }
	
	public void modificarUnidadMedida(UnidadMedida um) throws Exception{
    	Connection conn = null;
    	PreparedStatement stmt = null;
    	try {
	    	conn = (Connection) abrirConexion();
	    	String upd ="UPDATE unidadmedida SET descUnidadMedida = ?, siglaUnidadMedida = ?, IdUMConversion = ?, coeficienteConv = ? WHERE IdUnidadMedida = ?";
	    	stmt = (PreparedStatement) conn.prepareStatement(upd);
	    	stmt.setString(1, um.getDescUnidadMedida());
	    	stmt.setString(2, um.getSiglaUnidadMedida());
	    	stmt.setInt(3, (um.getUmConversion()!=null)?um.getUmConversion().getIdUnidadMedida():0); // null
	    	stmt.setDouble(4, (um.getUmConversion()!=null)?um.getCoeficiente():0); // null
	    	stmt.setInt(5, um.getIdUnidadMedida());
			stmt.execute();
		}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    }
	
	public UnidadMedida devolverUnidadMedida(Integer id) throws Exception{
    	Connection conn = null;
    	UnidadMedida  um = null;
    	PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String sel ="SELECT descUnidadMedida, siglaUnidadMedida, IdUMConversion, coeficienteConv FROM unidadmedida WHERE IdUnidadMedida = ? and umHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, id);
    		ResultSet result = stmt.executeQuery();
    		if(result.next()){
    			String descUnidadMedida = result.getString("descUnidadMedida");
    			String siglaUnidadMedida = result.getString("siglaUnidadMedida");
    			Integer IdUMConversion = result.getInt("IdUMConversion");
    			
    			if(IdUMConversion == 0){
    				um = new UnidadMedida(id, descUnidadMedida, siglaUnidadMedida, null, null, true);
    			}else{
    				Double coeficienteConv = result.getDouble("coeficienteConv");
    				UnidadMedida conv = devolverUnidadMedida(IdUMConversion);
    				um = new UnidadMedida(id, descUnidadMedida, siglaUnidadMedida, coeficienteConv, conv, true);   	
    			}
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
		return um;
    }
	
	public List<UnidadMedida> devolverTodas() throws Exception{
    	Connection conn = null;
    	List<UnidadMedida> unidadesDeMedida = new ArrayList<UnidadMedida>();
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
    		UnidadMedida um = null;
    		String sel ="SELECT * from unidadmedida WHERE umHabilitado = 1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery(sel);
    		while(result.next()){
    			Integer id = result.getInt("IdUnidadMedida");
    			String descUnidadMedida = result.getString("descUnidadMedida");
    			String siglaUnidadMedida = result.getString("siglaUnidadMedida");
    			Integer IdUMConversion = result.getInt("IdUMConversion");
    			
    			if(IdUMConversion == 0){
    				um = new UnidadMedida(id, descUnidadMedida, siglaUnidadMedida, null, null, true);
    			}else{
    				Double coeficienteConv = result.getDouble("coeficienteConv");
    				UnidadMedida conv = devolverUnidadMedida(IdUMConversion);
    				um = new UnidadMedida(id, descUnidadMedida, siglaUnidadMedida, coeficienteConv, conv, true);   	
    			}
    			unidadesDeMedida.add(um);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return unidadesDeMedida;
    }
}
